#pragma once
#include <opencv2/opencv.hpp>
#include <opencv2/quality.hpp>
#include <opencv2/xfeatures2d.hpp>

double compareHistograms(cv::Mat img1, cv::Mat img2)
{
    // 将图像转换为灰度图像
    cv::Mat gray1, gray2;
    cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);
    cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);

    // 计算直方图
    cv::Mat hist1, hist2;
    int histSize = 256;
    float range[] = { 0, 256 };
    const float* histRange = { range };
    cv::calcHist(&gray1, 1, 0, cv::Mat(), hist1, 1, &histSize, &histRange);
    cv::calcHist(&gray2, 1, 0, cv::Mat(), hist2, 1, &histSize, &histRange);

    // 归一化直方图
    cv::normalize(hist1, hist1, 0, 1, cv::NORM_MINMAX);
    cv::normalize(hist2, hist2, 0, 1, cv::NORM_MINMAX);

    // 比较直方图
    double similarity = cv::compareHist(hist1, hist2, cv::HISTCMP_CORREL);
    return similarity;
}

double compareSSIM(cv::Mat img1, cv::Mat img2)
{
    // 将图像转换为灰度图像
    cv::Mat gray1, gray2;
    cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);
    cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);

    // 计算 SSIM
    cv::Scalar ssim_value = cv::quality::QualitySSIM::compute(gray1, gray2, cv::noArray());
    return ssim_value[0];
}


double compareFeatures(cv::Mat img1, cv::Mat img2)
{
    // 初始化 ORB 检测器
    cv::Ptr<cv::ORB> orb = cv::ORB::create();

    // 检测关键点并计算描述符
    std::vector<cv::KeyPoint> keypoints1, keypoints2;
    cv::Mat descriptors1, descriptors2;
    orb->detectAndCompute(img1, cv::noArray(), keypoints1, descriptors1);
    orb->detectAndCompute(img2, cv::noArray(), keypoints2, descriptors2);

    // 使用 BFMatcher 匹配描述符
    cv::BFMatcher matcher(cv::NORM_HAMMING);
    std::vector<cv::DMatch> matches;
    matcher.match(descriptors1, descriptors2, matches);

    // 计算相似度（例如匹配点的平均距离）
    double sum_dist = 0;
    for (size_t i = 0; i < matches.size(); i++) {
        sum_dist += matches[i].distance;
    }
    double similarity = sum_dist / matches.size();
    return similarity;
}

double compareTemplate(cv::Mat img1, cv::Mat img2)
{
    // 将图像转换为灰度图像
    cv::Mat gray1, gray2;
    cv::cvtColor(img1, gray1, cv::COLOR_BGR2GRAY);
    cv::cvtColor(img2, gray2, cv::COLOR_BGR2GRAY);

    // 使用模板匹配
    cv::Mat result;
    cv::matchTemplate(gray1, gray2, result, cv::TM_CCOEFF_NORMED);

    // 获取最大匹配值
    double minVal, maxVal;
    cv::minMaxLoc(result, &minVal, &maxVal);

    return maxVal;
}